package demo2;

public class Test1 {
    //字符串常量池StringTable
    public static void main1(String[] args) {
        String str1 = "abcd";
        String str2 = "abcd";
        String str3 = new String("abcd");
        String str4 = new String("abcd");
        System.out.println(str1 == str2); //true
        System.out.println(str3 == str4); //false
        System.out.println(str1 == str3); //false
    }
    //Intern方法 -- 手动将创建的String对象添加到常量池中
    public static void main(String[] args) {
        char[] ch = new char[]{'a','b','c'};
        String s1 = new String(ch);  //此时s1不在常量池中
        s1.intern();                 //s1.intern() 调用之后，会将s1对象的引用放到常量池中
        String s2 = "abc";           //此时"abc"在常量池中了，s2创建时直接用常量池中的"abc"的引用
        System.out.println(s1 == s2);//打印true，把intern注释后打印true
    }
    //① String str = "hello";
    //创建两个对象，一个String对象，一个字符数组对象，字符数组的地址存在字符串常量池里
    //② String str = new String("hello");
    //创建三个对象，数组一个，new一个，str又一个
    //③ String str = new String(new char[]{'h','e','l','l','o'});
    //创建三个对象，和上面差不多

    //字符串本质不能修改，其实是private final char value[]
    //final指向不能改变，private是私有的，而且java标准也没有提供直接修改value的方法，所以不能修改
}
